问题
当程序由于未被捕获的异常而失败的时候,系统会自动地打印出该异常的堆栈轨迹。在堆栈轨迹中包含该异常的字符串表示法(string representation),即它的toString方法的调用结果。它通常包含该异常的类名,紧随其后的是细节消息(detail message)。程序员会根据打印出来的异常信息进行排错,也就是说,如果异常信息不够充足的话,会减缓排错的速度,那么,应该如何编写合适的异常信息?
答案
- 有一个很重要的原则,异常的细节消息应该清晰的描述出异常,便于以后分析。为了清晰的描述异常,异常的细节信息应该包含所有“对该异常有贡献”的参数和域的值。例如,IndexOutOfBoundsException异常的细节消息应该包含下界、上界以及没有落在界内的下标值。该细节消息提供了许多关于失败的信息。这三个值中任何一个或者全部都有可能是错的。实标的下标值可能小于下界或等于上界(“越界错误”),或者它可能是个无效值,太小或太大。下界也有可能大于上界(严重违反内部约束条件的一种情况)。每一种情形都代表了不同的问题,如果程序员知道应该去查找哪种错误,就可以极大地加速排错过程;为了确保在异常的细节消息中包含足够的能捕获失败的信息,一种办法是在异常的构造器中引入这些信息。
- 堆栈轨迹的用途是与源文件结合起来进行分析,它通常包含抛出该异常的确切文件和行数,以及堆栈中所有其他方法调用所在的文件和行数。因此,如果描述异常信息量过多,实际上也是冗余的,有些信息可以通过阅读源代码而获得;
- 异常的细节消息不应该与“用户层次的错误消息”混为一谈,后者对于最终用户而言必须是可理解的。与用户层次的错误消息不同,异常的字符串表示法主要是让程序员或者域服务人员用来分析失败的原因。
结论
当异常被捕获的时候,如果有关键的异常信息的时候,可以很方便的进行排错,添加关键的异常信息是很有必要的。